#include "head.h"

// 顺序表的创建
S_arr_list *S_Arr_Init(void)
{
    S_arr_list *L = (S_arr_list *)malloc(sizeof(S_arr_list));
    if (L == NULL)
    {
        printf("顺序表创建失败\n");
        return NULL;
    }
    memset(L->data, 0, ARR_MAX_SIZ * sizeof(F_data));
    memset(L->data, 0, ARR_MAX_SIZ * sizeof(char[16]));
    L->len = 0;
    return L;
}

// 顺序表的插入
int S_Arr_insert(S_arr_list *L, int pos, F_data data, char *user)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return -1;
    }
    if (L->len >= ARR_MAX_SIZ)
    {
        printf("顺序表已满\n");
        return -1;
    }
    if (pos < 1 || pos > L->len + 1)
    {
        printf("插入位置不合法\n");
        return -1;
    }

    // 从插入点开始后移数据
    for (int i = L->len; i >= pos; i--)
    {
        strcpy(L->user[i], L->user[i - 1]);
        L->data[i] = L->data[i - 1];
    }
    strcpy(L->user[pos - 1], user);
    L->data[pos - 1] = data;
    L->len++;
    return 0;
}

// 顺序表的删除
F_data S_Arr_delete(S_arr_list *L, int pos)
{
    F_data removed_data = {0};

    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return removed_data;
    }
    if (L->len == 0)
    {
        printf("顺序表内无数据\n");
        return removed_data;
    }
    if (pos < 1 || pos > L->len)
    {
        printf("删除位置不合法\n");
        return removed_data;
    }

    removed_data = L->data[pos - 1];

    // 将后续数据前移
    for (int i = pos; i < L->len; i++)
    {
        strcpy(L->user[i - 1], L->user[i]);
        L->data[i - 1] = L->data[i];
    }

    L->len--;
    return removed_data;
}

// 顺序表通过用户和航班ID查找
int S_Arr_Find_id_u(S_arr_list *L, int id, char *user)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return -1;
    }
    if (L->len == 0)
    {
        printf("顺序表内无数据\n");
        return -1;
    }
    for (int i = 0; i < L->len; i++)
    {
        if (L->data[i].id == id && !strcmp(L->user[i], user))
        {
            return i + 1;
        }
    }
   // printf("未找到航班\n");
    return -1;
}

// 顺序表通过用户名查找
void S_Arr_Find_user(S_arr_list *L, char *user, int *pos)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        pos[0] = -1;
        return;
    }
    if (L->len == 0)
    {
        printf("顺序表内无数据\n");
        pos[0] = -1;
        return;
    }
    int len = 0;
    for (int i = 0; i < L->len; i++)
    {
        if (!strcmp(L->user[i], user))
        {
            pos[len] = i + 1;
            len++;
        }
    }
    pos[len] = -1;
    if (pos[0] == -1)
    {
        printf("未找到用户\n");
        return;
    }
    return;
}

// 顺序表的遍历
void S_Arr_printf(S_arr_list *L)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return;
    }
    if (L->len == 0)
    {
        printf("顺序表内无数据\n");
        return;
    }

    for (int i = 0; i < L->len; i++)
    {
        printf("用户名: %s 班次: %d 机型: %s 起点站: %s 终点站: %s 起飞时间: %02d:%02d 到达时间: %02d:%02d 飞行时间: %s 票价: %d 载客量: %d 剩余座位: %d 是否飞: %c\n",
               L->user[i], L->data[i].id, L->data[i].flighttype, L->data[i].startcity, L->data[i].arrivecity,
               L->data[i].starttime[0], L->data[i].starttime[1], L->data[i].arrivetime[0], L->data[i].arrivetime[1],
               L->data[i].flytime, L->data[i].value, L->data[i].maxNUM, L->data[i].leftbuyersa, L->data[i].whetherfly);
    }
}

// 顺序表的清空
void S_Arr_clear(S_arr_list *L)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return;
    }
    memset(L->data, 0, ARR_MAX_SIZ * sizeof(F_data));
    memset(L->data, 0, ARR_MAX_SIZ * sizeof(char[16]));
    L->len = 0;
}
// 双向链表的销毁
void S_Arr_free(S_arr_list **L)
{
    if (L == NULL)
    {
        printf("顺序表 为 NULL\n");
        return;
    }
    free(*L);
    *L = NULL;
}

// 从文件中读取订购记录
void S_Arr_read(S_arr_list *L)
{
    if (L == NULL)
    {
        ERRLOG("双向循环链表 为 NULL");
        return;
    }

    FILE *fp = fopen(ORDER_FILE, "r+"); // 打开文件
    if (fp == NULL)
    {
        ERRLOG("文件打开失败");
        return;
    }

    // 获取文件行数
    fseek(fp, 0, SEEK_SET);
    char ch = 0;
    int pos = 0;

    while ((ch = fgetc(fp)) != EOF)
    {
        if (ch == '\n')
        {
            pos++;
        }
    }
    // 读取数据
    fflush(fp); // 刷新文件

    fseek(fp, 0, SEEK_SET);

    for (size_t i = 0; i < pos; i++)
    {
        fscanf(fp, "%s\t", L->user[i]);
        fscanf(fp, "%d\t", &L->data[i].id);
        fscanf(fp, "%s\t", L->data[i].flighttype);
        fscanf(fp, "%s\t", L->data[i].startcity);
        fscanf(fp, "%s\t", L->data[i].arrivecity);
        fscanf(fp, "%d:%d\t", &L->data[i].starttime[0], &L->data[i].starttime[1]);
        fscanf(fp, "%d:%d\t", &L->data[i].arrivetime[0], &L->data[i].arrivetime[1]);
        fscanf(fp, "%s\t", L->data[i].flytime);
        fscanf(fp, "%d\t", &L->data[i].value);
        fscanf(fp, "%d\t", &L->data[i].maxNUM);
        fscanf(fp, "%d\t", &L->data[i].leftbuyersa);
        fscanf(fp, "%c\n", &L->data[i].whetherfly);
        L->len++;
    }

    fflush(fp); // 刷新文件
    fclose(fp);
}

// 把订购记录保存到文件中
void S_Arr_save(S_arr_list *L)
{
    // 安全判断
    if (L == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (L->len == 0)
    {
        printf("链表无数据\n");
        return;
    }
    FILE *fp = fopen(ORDER_FILE, "w+"); // 打开文件
    if (fp == NULL)
    {
        printf("文件创建失败\n");
        return;
    }

    fseek(fp, 0, SEEK_SET);
    for (int i = 0; i < L->len; i++)
    {
        fprintf(fp, "%s\t", L->user[i]);
        fprintf(fp, "%d\t", L->data[i].id);
        fprintf(fp, "%s\t", L->data[i].flighttype);
        fprintf(fp, "%s\t", L->data[i].startcity);
        fprintf(fp, "%s\t", L->data[i].arrivecity);
        fprintf(fp, "%d:%d\t", L->data[i].starttime[0], L->data[i].starttime[1]);
        fprintf(fp, "%d:%d\t", L->data[i].arrivetime[0], L->data[i].arrivetime[1]);
        fprintf(fp, "%s\t", L->data[i].flytime);
        fprintf(fp, "%d\t", L->data[i].value);
        fprintf(fp, "%d\t", L->data[i].maxNUM);
        fprintf(fp, "%d\t", L->data[i].leftbuyersa);
        fprintf(fp, "%c\n", L->data[i].whetherfly);
    }
    fflush(fp); // 刷新文件
    fclose(fp);
}